์—๋””ํ„ฐ ๋‘ ๊ฐœ๊ฐ€ ๋‚˜ํƒ€๋‚จ

8/6/2025

๋ฌธ์ œ์ƒํ™ฉ

์ฒ˜์Œ์— ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ์— ๋“ค์–ด๊ฐ€๋ฉด <div class="ql-container">๊ฐ€ ๋‘๊ฐœ๊ฐ€ ์ƒ๊น€. ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด ํ•˜๋‚˜๋งŒ ๋‚จ์Œ.

์ฝ”๋“œ

"use client";
import Quill from "quill";
import { useRef, useEffect } from "react";
import "quill/dist/quill.bubble.css";

export default function Viewer({ content }: { content: string }) {
  const containerRef = useRef<HTMLDivElement | null>(null);
  const quillRef = useRef<Quill | null>(null);

  useEffect(() => {
    console.log("useEffect()");
    console.log("content:", typeof content, content);
    let quill: Quill | null = null;
    let container: HTMLDivElement | null = null;

    const loadQuill = async () => {
      console.log("loadQuill()");
      if (!containerRef.current) return;
      const QuillModule = await import("quill");
      const Quill = QuillModule.default;

      container = containerRef.current;
      const editorContainer = container.appendChild(
        document.createElement("div")
      );
      quill = new Quill(editorContainer, {
        theme: "bubble",
      });
      quill.enable(false);
      quillRef.current = quill;
      const delta = JSON.parse(content);
      quill.setContents(delta);
    };
    loadQuill();
  });

  return (
    <div className="h-full overflow-auto">
      <div ref={containerRef} className="ml-20 mr-30 px-15 outline-none" />
    </div>
  );
}

์„ค๋ช…

์ฝ˜์†”์—๋„ console.log๋“ค์ด ๋‘๋ฒˆ์”ฉ ์ฐํžŒ๋‹ค. ์ด๊ฒŒ useEffect๊ฐ€ ๋‘๋ฒˆ ์‹คํ–‰๋œ๋‹ค๋Š” ๋ง์ธ๊ฑฐ ๊ฐ™์€๋ฐ. ์ฐพ์•„๋ณด๋‹ˆ๊นŒ ๊ฐœ๋ฐœํ™˜๊ฒฝ์—์„œ๋Š” useEffect๊ฐ€ ๋‘๋ฒˆ ์‹คํ–‰๋œ๋‹ค๊ณ  ํ•œ๋‹ค. Strict Mode ๋•Œ๋ฌธ์—. ์‹ค์ œ๋กœ vercel์˜ ๋ฐฐํฌํŒ์—์„œ ๋ณด๋‹ˆ๊นŒ ๊ฒŒ์‹œ๊ธ€์ด ๋‘๋ฒˆ ๋“ฑ์žฅํ•˜์ง€ ์•Š์Œ.